package com.iwhalecloud.bss.kite.cucc.service.attr.handler;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.iwhalecloud.bss.kite.client.enums.TriggerStrategy;
import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteObjectUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalKeyConsts;
import com.iwhalecloud.bss.kite.dataservice.cache.ProductCache;
import com.iwhalecloud.bss.kite.manager.api.IOperateSceneInstService;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.enums.ActionType;
import com.iwhalecloud.bss.kite.manager.inst.*;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.attr.handler.AbstractAttrHandler;
import com.iwhalecloud.bss.kite.service.scene.attr.OperateInstAttrService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* @author cheng.leizhen01
* @date 2021年05月26日
* @version V1.0
* @Package com.iwhalecloud.bss.kite.cucc.service.attr.handler
*/
public class LocalTextMessageAttrHandler extends AbstractAttrHandler<KiteInst, AttrData> {

    @Autowired
    private IQuerySceneInstService querySceneInstService;

    @Autowired
    IOperateSceneInstService operateSceneInstService;

    @Autowired
    OperateInstAttrService operateInstAttrService;
    @Override
    public void onShow(KiteAttr attr, KiteInst inst, AttrData data) {
        linkClearValue(attr,inst,data);
    }
   /* @Override
    public void after(KiteAttr attr, KiteInst inst, AttrData data) {
        linkClearValue(attr,inst,data);
    }*/
    private void linkClearValue(KiteAttr attr, KiteInst inst, AttrData data){
        if (KiteObjectUtils.isEmpty(attr)) {
            return;
        }
        //语音费(元/分钟)
        KiteAttr  voiceFeeAttr = inst.getAttr("200003710");
        if (KiteObjectUtils.isEmpty(voiceFeeAttr)) {
            return;
        }
        // 取所有接入类产品
        List<KiteProdInst> kiteProdInstList = querySceneInstService.listProdInsts(data.getSceneInstId());
        final KiteProdInst[] prodInsts = new KiteProdInst[1];
        if (KiteListUtils.isNotEmpty(kiteProdInstList)) {
            kiteProdInstList.stream().forEach(prodInst -> {
                List<KiteProdInstFunc> kiteProdInstFuncs = querySceneInstService
                    .listProdInstFuncs(data.getCustId(), prodInst.getProdInstId());
                if (KiteListUtils.isNotEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs.stream().forEach(kiteProdInstFunc -> {
                        //通信计划信息
                        if (KiteStringUtils.equalsAny(ProductCache.get(kiteProdInstFunc.getSpecId()).getProdNbr(), "300000151", LocalKeyConsts.FUNC_PROD_ID_YF5GTX)) {
                            prodInsts[0] = prodInst;
                            return;
                        }
                    });
                }
            });
        }
        // 处理资费计划短信和语音资费信息
        List<KiteProdInstFunc> kiteProdInstFuncs = Lists.newArrayList();
        if (!KiteObjectUtils.isEmpty(prodInsts) && !KiteObjectUtils.isEmpty(prodInsts[0])) {
            if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                kiteProdInstFuncs = querySceneInstService
                    .listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(),
                        LocalKeyConsts.FUNC_PROD_ID_5GTX);   // 5G

                if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs = querySceneInstService
                        .listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(),
                            LocalKeyConsts.FUNC_PROD_ID_TX);  //3/4G
                }
                if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs = querySceneInstService
                        .listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(),
                            LocalKeyConsts.FUNC_PROD_ID_NBTX);  //NB
                }
                if (KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs = querySceneInstService
                        .listProdInstFuncsByProdId(data.getCustId(), prodInsts[0].getProdInstId(),
                            LocalKeyConsts.FUNC_PROD_ID_YF5GTX);  //雁飞5G
                }
            }
            if (!KiteListUtils.isEmpty(kiteProdInstFuncs)) {
                kiteProdInstFuncs = kiteProdInstFuncs.stream().filter(t -> !ActionType.D.equals(t.getActionType()))
                    .collect(Collectors.toList());
                //定义一个集合 用来装通信计划中通讯类型的并集
                List cTypeList = new ArrayList();
                kiteProdInstFuncs.forEach(funcProdInst -> {
                    // 获取通信计划的通讯类型信息
                    KiteAttr communicationTypesAttr = funcProdInst.getAttr("200003688");
                    if (Objects.nonNull(communicationTypesAttr) && KiteStringUtils.isNotEmpty(communicationTypesAttr.getValue())) {
                        cTypeList.add(communicationTypesAttr.getValue());
                    }
                });
                if(!KiteListUtils.isEmpty(cTypeList)){
                    String communicationTypes =cTypeList.toString();
                    // 通信计划的通讯类型选择数据，资费计划不展示短信资费(元/条)、语音费(元/分钟)
                    if (communicationTypes.contains("100003092")) {
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        voiceFeeAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    }
                    // 通信计划的通讯类型选择数据+语音，资费计划展示语音费(元/分钟)，且必填
                    if (communicationTypes.contains("100006422") && !communicationTypes.contains("100006423")) {
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        voiceFeeAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                    }
                    // 通信计划的通讯类型选择数据+短信，资费计划展示短信资费(元/条)
                    if (communicationTypes.contains("100006423") && !communicationTypes.contains("100006422")) {
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                        voiceFeeAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                    }
                    // 通信计划的通讯类型选择数据+短信+语音，资费计划展示短信资费(元/条)、语音费(元/分钟)
                    if (communicationTypes.contains("100006424") || (communicationTypes.contains("100006422") && communicationTypes.contains("100006423"))) {
                        attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                        voiceFeeAttr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                    }
                }
            }
        }
        // 加上这个设置这个值的原因，是为了不将实例的actiontype有K设置为M
        data.setTriggerStrategy(TriggerStrategy.LOAD);
        operateInstAttrService.setAttrValue(inst, attr.getFieldName(), attr.getValue(), data.getSceneInstId(), JSON.toJSONString(data));
        operateSceneInstService.setAttr(data.getSceneInstId(), inst.getInstType(), inst.getInstId(), attr);
    }
}

